<?php
$path_root_ProdutoClass = dirname(__FILE__);
$DS = DIRECTORY_SEPARATOR;
$path_root_ProdutoClass = "{$path_root_ProdutoClass}{$DS}..{$DS}";
require_once "{$path_root_ProdutoClass}class{$DS}default.class.php";
class produto extends defaultClass{
    protected $dbConn;
	public function __construct() {
		$this->dbConn = new DataBaseClass();
		$this->setConfig();
	}
	protected function insertProdutoMultinet($arr){
		$sql = array();
		$sql[] = "
			INSERT INTO {$this->bd_producao}.produtos SET 
				nome = '{$arr['nome']}'
				,referencia = '{$arr['referencia']}'
				,descricao = '{$arr['descricao']}'
				,status = '{$arr['status']}'
				,produto_aliq_ipi = '{$arr['produto_aliq_ipi']}'
				,preco = '{$arr['preco']}'
				,ProdutoID = '{$arr['ProdutoID']}'
				,quantidade = '{$arr['quantidade']}'
				,tipo_produto_tipo_id = '{$arr['tipo_produto_tipo_id']}'
		";
		return $this->dbConn->db_execute(implode("\n",$sql));
	}
	protected function updateProdutoMultinet($arr){
		$sql = array();
		$sql[] = "
			UPDATE {$this->bd_producao}.produtos SET 
				nome = '{$arr['nome']}'
				,referencia = '{$arr['referencia']}'
				,descricao = '{$arr['descricao']}'
				,status = '{$arr['status']}'
				,produto_aliq_ipi = '{$arr['produto_aliq_ipi']}'
				,preco = '{$arr['preco']}'
				,ProdutoID = '{$arr['ProdutoID']}'
				,quantidade = '{$arr['quantidade']}'
				,tipo_produto_tipo_id = '{$arr['tipo_produto_tipo_id']}'
			WHERE id = '{$arr['id']}'
		";
		return $this->dbConn->db_execute(implode("\n",$sql));
	}
	protected function getProdutoMultinetByReferencia($arr){
		$sql = array();
		$sql[] = "
			SELECT	id
			FROM	{$this->bd_producao}.produtos
			WHERE referencia = '{$arr['referencia']}'
		";
		$result = $this->dbConn->db_query(implode('\n',$sql));
		if($result['total'] > 0){
			$rs=$this->dbConn->db_fetch_assoc($result['result']);
			return $rs['id'];
		}
		return 0;
	}
	
	protected function getTipoProdutoByTitulo($produto_tipo_titulo){
		$sql = array();
		$sql[] = "
			SELECT	produto_tipo_id
			FROM	tb_produto_tipo
			WHERE	1 = 1
			AND		produto_tipo_titulo = '{$produto_tipo_titulo}'
		";
		$result = $this->dbConn->db_query(implode('\n',$sql));
		if($result['total'] > 0){
			$rs=$this->dbConn->db_fetch_assoc($result['result']);
			return $rs['produto_tipo_id'];
		}
		return 0;
	}
	public function edit(){
		$this->dbConn->db_start_transaction();
		if(isset($this->values['produto_id'])&&trim($this->values['produto_id'])!=''){
			$result = $this->update();
		}else{
			$result = $this->insert();
		}
		if(!$result['success']){
			$this->dbConn->db_rollback();
		}else{
			$this->dbConn->db_commit();
		}
		return $result;
	}
	
	protected function insert(){
		if(count($this->values) > 0){
			$sql = array();
			$sql[] = "INSERT INTO tb_produto SET";
			$i = 0;
			foreach($this->values AS $k=>$v){
				if($i < 1){
					$sql[] = "{$k} = '{$v}'";
				}else{
					$sql[] = ",{$k} = '{$v}'";
				}
				$i++;
			}
			return $this->dbConn->db_execute(implode("\n",$sql));
		}
		return array(
			'success'=>false
			,'last_id'=>0
		);
	}
	protected function update(){
		if(count($this->values) > 0){
			$sql = array();
			$sql[] = "UPDATE tb_produto SET";
			$i = 0;
			foreach($this->values AS $k=>$v){
				if($k=='produto_id'){
					continue;
				}
				if($i < 1){
					$sql[] = "{$k} = '{$v}'";
				}else{
					$sql[] = ",{$k} = '{$v}'";
				}
				$i++;
			}
			$sql[] = "WHERE produto_id = '{$this->values['produto_id']}'";
			return $this->dbConn->db_execute(implode("\n",$sql));
		}
		return array(
			'success'=>false
		);
	}
	
	protected function getProdutoIdByPartNumber($produto_part_number){
		$sql = array();
		$sql[] = "
			SELECT	produto_id
			FROM	tb_produto
			WHERE	1 = 1
			AND		produto_part_number  ='{$produto_part_number}'
		";
		$result = $this->dbConn->db_query(implode('\n',$sql));
		if($result['total'] > 0){
			$rs=$this->dbConn->db_fetch_assoc($result['result']);
			return $rs['produto_id'];
		}
		return 0;
	}
	public function importListas(){
		$aArr = array();
		$path_root_ProdutoClass = dirname(__FILE__);
		$DS = DIRECTORY_SEPARATOR;
		$path_root_ProdutoClass = "{$path_root_ProdutoClass}{$DS}..{$DS}";
		$handle = fopen ("{$path_root_ProdutoClass}listas{$DS}Lista_de_Precos_CISCO_-_CISCO_-_-_NaoMapeado_-_APR14.csv","r");
		$row = 1;
		while (($data = fgetcsv($handle, 4096, ";")) !== FALSE) {
			$arr = array();
			$data = $this->arrayTrim($data);
			$data = $this->utf8_array_encode($data);
			if($row < 2){
				$row++;
				continue;
			}
			$arr['tipo_produto_tipo_id'] = $this->getTipoProdutoByTitulo($data[2]);
			$arr['produto_part_number'] = $data[0];
			$arr['produto_titulo'] = $data[1];
			$arr['produto_aliq_ipi'] = $this->currencyBR2DB($data[3]);
			$arr['produto_preco_revenda_icms_4'] = $this->currencyBR2DB($data[4]);
			$arr['produto_preco_revenda_icms_7'] = $this->currencyBR2DB($data[5]);
			$arr['produto_preco_revenda_icms_17'] = $this->currencyBR2DB($data[6]);
			$arr['produto_preco_direto_icms_4'] = $this->currencyBR2DB($data[7]);
			$arr['produto_preco_direto_icms_7'] = $this->currencyBR2DB($data[8]);
			$arr['produto_preco_direto_icms_17'] = $this->currencyBR2DB($data[9]);
			$arr['produto_class_fisc'] = $data[10];
			$produto_id = $this->getProdutoIdByPartNumber($data[0]);
			if($produto_id > 1){
				$arr['produto_id'] = $produto_id;
			}
			$this->values = $arr;
			$aArr[$data[0]] = $arr;
			$this->edit();
			$row++;
		}
		fclose($handle);
		//$this->debug($aArr);
	}
	
	public function atualizaProdutoWS(){
		$client = new nusoap_client("{$this->urlWS}?wsdl",true,false,false,false,false,0,300);
		$err = $client->getError();
		$xml[] = '<AuthenticationHeader xmlns="http://webservices.westcon.com.br/">';
		$xml[] = "<User>{$this->emailAuthWS}</User>";
		$xml[] = "<Password>{$this->senhaAuthWS}</Password>";
		$xml[] = '</AuthenticationHeader>';
		$param = array(
			'dateInit'=>date("Y-m-01")
			,'dateFinal'=>date("Y-m-d")
			,'betweenInit'=>1
			,'betweenFinal'=>10000
		);
		$client->setHeadersUser(implode("\n",$xml));
		$client->soap_defencoding = 'UTF-8';
		$result = $client->call('GetPartNumbersUpdated',$param,'http://webservices.westcon.com.br/');
		$retorno = false;
		if ($client->fault) {
			//echo '<h2>Fault (Expect - The request contains an invalid SOAP body)</h2><pre>'; print_r($result); echo '</pre>';
			$retorno= false;
		} else {
			$err = $client->getError();
			if ($err) {
				//echo '<h2>Error</h2><pre>' . $err . '</pre>';
				$retorno= false;
			} else {
				//echo '<h2>Result</h2><pre>'; print_r($result); echo '</pre>';
				$retorno= true;
			}
		}
		//echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
		//echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
		//echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->getDebug(), ENT_QUOTES) . '</pre>';
		if($retorno){
			if($result['GetPartNumbersUpdatedResult']['Success']){
				$aItems = $result['GetPartNumbersUpdatedResult']['Skus']['SKU'];
				$aArr = array();
				
				if(count($aItems) > 0){
					foreach($aItems AS $data){
						$arr = array();
						$arr['tipo_produto_tipo_id'] = $data['SkuType'];
						$arr['produto_part_number'] = $data['Sku'];
						$arr['produto_titulo'] = $data['SkuDescription'];
						$arr['produto_class_fisc'] = $data['CodFiscal'];
						$arr['produto_preco_net'] = $data['PriceNetReseller'];
						$arr['produto_status'] = $data['CodSituation'];
						$produto_id = $this->getProdutoIdByPartNumber($arr['produto_part_number']);
						$arr['produto_estoque'] = $this->getStockProduto($arr['produto_part_number']);
						if($produto_id > 1){
							$arr['produto_id'] = $produto_id;
						}
						$this->values = $arr;
						$this->edit();
					}
				}
				//$this->debug($aArr);
			}
		}
		return $retorno;
	}
	public function getStockProdutoWS($partnumber){
		$client = new nusoap_client("{$this->urlWS}?wsdl",true,false,false,false,false,0,300);
		$err = $client->getError();
		$xml[] = '<AuthenticationHeader xmlns="http://webservices.westcon.com.br/">';
		$xml[] = "<User>{$this->emailAuthWS}</User>";
		$xml[] = "<Password>{$this->senhaAuthWS}</Password>";
		$xml[] = '</AuthenticationHeader>';
		$param = array(
			'Erp'=>1
			,'PartNumbers'=>array(
				'string'=>$partnumber
			)
			
		);
		$client->setHeadersUser(implode("\n",$xml));
		$client->soap_defencoding = 'UTF-8';
		$result = $client->call('CheckStock',$param,'http://webservices.westcon.com.br/');
		$retorno = false;
		if ($client->fault) {
			//echo '<h2>Fault (Expect - The request contains an invalid SOAP body)</h2><pre>'; print_r($result); echo '</pre>';
			$retorno= false;
		} else {
			$err = $client->getError();
			if ($err) {
				//echo '<h2>Error</h2><pre>' . $err . '</pre>';
				$retorno = false;
			} else {
				//echo '<h2>Result</h2><pre>'; print_r($result); echo '</pre>';
				$retorno = true;
			}
		}
		//echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
		//echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
		//echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->getDebug(), ENT_QUOTES) . '</pre>';
		if($retorno){
			if($result['CheckStockResult']['Success']){
				$aItems = $result['CheckStockResult']['Items']['StockItem'];
				return $aItems['LocalStock'];
			}
		}
		return 0;
	}
	
	public function atualizaProdutosCadastradosWS($aProdutoId=array()){
		$sql = array();
		$sql[] = "
			SELECT	*
			FROM	tb_produto
			WHERE	1 = 1
		";
		if(count($aProdutoId) > 0){
			$sProdutoId = implode(",\n",$aProdutoId);
			$sql[] = "AND produto_id IN (
				{$sProdutoId}
			)";
		}
		//$sql[] = "LIMIT	10";
		$result = $this->dbConn->db_query(implode("\n",$sql));
		if($result['total'] > 0){
			while($rs=$this->dbConn->db_fetch_assoc($result['result'])){
				$arr = array();
				$arr['produto_id'] = $rs['produto_id'];
				$arr['produto_estoque'] = $this->getStockProduto($rs['produto_part_number']);
				$this->values = $arr;
				$this->edit();
			}
		}
	}
	public function atualizaTodosProdutosWS(){
		$this->atualizaProdutoWS();
		$this->atualizaProdutosCadastradosWS();
	}
	public function importaProdutosMultinet(){
		$sql = array();
		$sql[] = "
			SELECT	*
			FROM	tb_produto
			WHERE	1 = 1
		";
		$result = $this->dbConn->db_query(implode("\n",$sql));
		if($result['total'] > 0){
			while($rs=$this->dbConn->db_fetch_assoc($result['result'])){
				$arr = array();
				$pos1 = strpos($rs['produto_titulo'], "(");
				if($pos1!==false){
					$pos2 = strpos($rs['produto_titulo'], ")");
					$pos2 = ($pos2===false)?strlen($rs['produto_titulo']):$pos2;
					$newNome = substr_replace($rs['produto_titulo'], '',$pos1, $pos2);
					$newNome = str_replace(array("(",")"), "", $newNome);
				}else{
					$newNome  =$rs['produto_titulo'];
				}
				$pos1 = strpos($newNome, "***");
				if($pos1!==false){
					$pos2 = strpos($newNome, "***",$pos1+3);
					$pos2 = ($pos2===false)?strlen($newNome):$pos2;
					$newNome = substr_replace($newNome, '',$pos1, $pos2);
					$newNome = str_replace(array("***"), "", $newNome);
				}
				
				$newNome = str_replace(array("(",")","***NÃO HOMOLOGADO PARA O BRASIL***"), "", $newNome);
				$arr['nome'] = $newNome;
				$arr['referencia'] = $rs['produto_part_number'];
				$arr['descricao'] = $rs['produto_titulo'];
				$arr['status'] = $rs['produto_status'];
				$arr['produto_aliq_ipi'] = $rs['produto_aliq_ipi'];
				$arr['preco'] = $rs['produto_preco_net'];
				$arr['ProdutoID'] = $rs['produto_id'];
				$arr['quantidade'] = trim($rs['produto_estoque']=='')?0:$rs['produto_estoque'];
				$arr['tipo_produto_tipo_id'] = $rs['tipo_produto_tipo_id'];
				$arr = $this->arrayTrim($arr);
				$id = $this->getProdutoMultinetByReferencia($arr);
				if($id > 0){
					$arr['id'] =$id;
					$this->updateProdutoMultinet($arr);
				}else{
					$this->insertProdutoMultinet($arr);
				}
			}
		}
	}
}